// #include <iostream>
// #include <vector>
// using namespace std;

// int main() {
//     int n, m;
//     cin >> n >> m;
//     vector<int> a(n);
//     int k = 0;  // 记录数组元素的总和

//     for(int i = 0; i < n; i++) {
//         cin >> a[i];
//         k += a[i];
//     }

//     // 如果 m 大于数组元素总和，则没有可能的组合
//     if(m > k) {
//         cout << 0;
//         return 0;
//     }

//     // 如果 m 等于 0，那么直接输出 1，因为存在一个空集合，其和为 0
//     if(m == 0) {
//         cout << 1;
//         return 0;
//     }

//     vector<int> dp(m + 1, 0);
//     dp[0] = 1;  // 空集和为 0，初始化 dp[0] 为 1

//     // 遍历每个元素，更新 dp 数组,这个dp/数组表示的是和未i的子集数
//     for(int i = 0; i < n; i++) {
//         for(int j = m; j >= a[i]; j--) {  // 从后向前遍历，防止重复计数
//             dp[j] += dp[j - a[i]];
//         }
//     }

//     cout << dp[m];  // 输出和为 m 的子集数量
//     return 0;
// }












#include <iostream>
using namespace std;
const int N = 110, M = 10010;
int a[N];
int dp[N][M];
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    dp[0][0] = 1; // 初始状态：不选菜，凑出 0 元有 1 种方案
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            dp[i][j] = dp[i-1][j]; // 不选第 i 种菜
            if (j >= a[i]) {
                dp[i][j] += dp[i-1][j - a[i]]; // 选第 i 种菜
            }
        }
    }
    cout << dp[n][m];
    return 0;
}



#include <iostream>
using namespace std;
const int N = 1100;
int a[N];
int dp[11000];
int main() {
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    dp[0] = 1;
    for(int i = 0; i < n; i++) {
        for(int j = m; j >= a[i]; j--) {
            dp[j] += dp[j - a[i]];
        }
    }
    cout << dp[m];
    return 0;
}


















// #include <iostream>
// #include <algorithm>
// using namespace std;
// const int N = 120;
// int a[N];    
// int n, m;
// int sum;
// int cnt;
// int k;
// void dfs(int pos) {
//     if(pos > n) {
//         return;
//     }
//     if(sum > m) {
//         return;
//     }
//     if(sum == m) {
//         cnt++;
//         return;
//     }
//     for(int i = pos; i < n; i++) {
//         if(sum + a[i] > m) {
//             continue;
//         }
//         sum += a[i];
//         dfs(i + 1);
//         sum -= a[i];
//     }
// }
// int main() {

//     cin >> n >> m;
//     for(int i = 0; i < n; i++) {
//         cin >> a[i];
//         k += a[i];
//     }
//     if(m > k) {
//         cout << 0;
//         return 0;
//     }
//     if(m == 0) {
//         cout << 0;
//         return 0;
//     }
//     sort(a, a + n);
//     dfs(0);
//     cout << cnt;
//     return 0;
// }



